package br.com.caelum.vraptor.controller;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.inject.Inject;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.auth_annotations.EscolaAdmin;
import br.com.caelum.vraptor.components.UsuarioSession;
import br.com.caelum.vraptor.dao.GenericDAO;
import br.com.caelum.vraptor.entidades.Aluno;
import br.com.caelum.vraptor.entidades.Escola;
import br.com.caelum.vraptor.entidades.Usuario;

@Controller
public class AlunoController {
	
	@Inject
	private Result result;
	
	@Inject
	private GenericDAO<Aluno> dao;

	@Inject
	private GenericDAO<Usuario> usuarioDAO;

	@Inject
	private UsuarioSession usuarioSession;
	
	@EscolaAdmin
	public void add(){
		
	}

	@EscolaAdmin
	public void save(Aluno aluno) {
		Aluno alunoAntigo = null; //Declara o objeto do cadastro atual do aluno para o caso de está ocorrendo uma edição
		aluno.setEscola((Escola) usuarioSession.getUsuario().getAutenticavel()); //Pega usuario da escola que está na sessão e cadastra o aluno como aluno dessa escola
		Calendar data = Calendar.getInstance(); //Pega a data atual do sistema
		if (aluno.getId() < 1) { //Se o aluno está sendo cadastrado pela primeira vez...
			//aluno.setStatusMatricula(true);
			aluno.setCriadoEm(data); //Define a data de criação com o valor da data do sistema
		}
		else { //Se estiver sendo editado...
			alunoAntigo = dao.find(aluno.getId()); //Carrega o cadastro atual do aluno do banco
			aluno.setCriadoEm(alunoAntigo.getCriadoEm()); //Redefine no novo cadastro a data de criação de acordo com cadastro atual. Se isso não for feito, esse valor será perdido e ficará como null.
			aluno.setAtualizadoEm(data); //Preenche o campo atualizadoEm com a data do sistema
		}
			//int ano = data.get(Calendar.YEAR); //Pega o ano
			
		dao.save(aluno); //Salva o aluno
		List<Aluno> alunos = dao.find(); //Pega lista completa dos alunos cadastrados no banco de dados
		aluno = alunos.get(alunos.size()-1); //Pega o último aluno da lista e joga no objeto aluno. Como ele é o último da lista, será obrigatoriamente o que acabou de ser cadastrado na linha anterior.
		//aluno.setMatricula(ano + "." + aluno.getEscola().getId() + "." + aluno.getId()); //A matrícula é composta pelo ano de cadastro ponto o id da escola do aluno ponto o id do aluno.
		dao.save(aluno); //Salva o aluno com sua matrícula
		//Usuario usuario = new Usuario(); //Instancia Usuario
		//usuario.setLogin(aluno.getMatricula()); //O login do aluno será a sua matrícula.
		//usuario.setSenha("123"); //Define a senha padrão
//		usuario.setPerfil(Perfil.ALUNO); //Define o perfil ALUNO para o aluno. Essa variável Perfil.ALUNO é um atributo estático da classe Perfil.
//		usuario.setAutenticavel(aluno); //Define o atributo autenticavel do objeto usuário. Esse atributo pode ser de uma das classes filhas de Autenticavel: Aluno, Escola ou Empresa. Nesse caso, é o objeto aluno que acabou de ser cadastraddo.
		//usuarioDAO.save(usuario); //Salva o usuário no banco
		result.redirectTo(this).list();
	}
	
	@EscolaAdmin
	public List<Aluno> list(){
		if (usuarioSession.getUsuario().getPerfil().getId() == 3) { //Se o perfil for de uma empresa, retorna a lista inteira de todos os alunos de todas as escolas de uma só vez
		return dao.find();
		}
		
		List<Aluno> lista = dao.find(); //Pega a lista completa dos alunos do banco
		List<Aluno> alunos = new ArrayList<Aluno>(); //Instancia uma nova lista. Esta lista conterá apenas os alunos da escola que está logada no momento. De acordo com o interceptor, se o usuário logado não for uma empresa, deve ser uma escola.
		
		for (Aluno aluno : lista) { //Percorre a lista de todos os alunos cadastrados
			if (aluno.getEscola().getId() == usuarioSession.getUsuario().getAutenticavel().getId()) { //Se a escola logada na sessão for a escola que consta no cadastro de cada aluno da lista, adiciona esse aluno à lista que será retornada.
				alunos.add(aluno);
			}
		}
		
		return alunos; //Retorna a lista contendo apenas os alunos pertencentes à escola logada na sessão
	}
	
	@EscolaAdmin
	public Aluno edit(int id){
		return dao.find(id);
	}
	
	@EscolaAdmin
	public void delete(int id) {
		Aluno aluno = dao.find(id); //Pega o aluno com o id especificado no banco de dados
		Usuario usuario = new Usuario();
		usuario.setLogin(aluno.getMatricula()); //Povoa o atributo login do objeto usuario que acabou de ser instanciado. Esse valor que vai povoar o atributo é adquirido da matrícula do objeto aluno que acabou de ser carregado.
		dao.delete(aluno); //Apaga o aluno do banco de dados
		usuarioDAO.delete(usuario); //Apaga o usuário correspondente a esse aluno do banco de dados
		result.redirectTo(this).list();
	}

	@EscolaAdmin
	public void alterarsenha() { //Página do formulário de mudança de senha
		
	}
	

	public void atualizausuario(Usuario usuarioantigo, Usuario usuarionovo) { //Método para alterar a senha, recebe dois parâmetros: usuarioantigo - contém a senha atual do usuário digitada no formulário, usuarionovo contém a nova senha.
		/**
		*Na página de mudança de senha, o campo senha atual deve ter name="usuarioantigo.senha" e o campo nova senha deve ter name="usuarionovo.senha";
		*Deve haver um input hidden para cada campo senha antiga e nova senha submetendo o login do usuário na sessão;
		*Um input hidden deve ter name="usuarioantigo.login" com o valor do login do usuário e o outro deve ter name="usuarionovo.login" com o mesmo valor.
		*/
		Usuario usuarioSalvo = usuarioDAO.find(usuarioantigo.getLogin()); //Pega o cadastro do usuário no banco
		
		if (usuarioantigo.getSenha().equals(usuarioSalvo.getSenha())) { //Verifica se a senha atual digitada no formulário confere com a senha que consta no banco
			usuarioSalvo.setSenha(usuarionovo.getSenha()); //Altera a senha do objeto
			usuarioDAO.save(usuarioSalvo); //Salva o usuário com a senha alterada
			result.redirectTo(this).senhaalterada(); //Redireciona para a página da mensagem de sucesso
		}
		else { //Se senha está incorreta...
			result.redirectTo(this).alterarsenha(); //Volta para a página de mudança de senha para que a senha atual seja redigitada para que possa alterá-la
		}
		
	}
	

	public void senhaalterada() { //Página de sucesso
		
	}

	@EscolaAdmin
	public void pesquisaUsuario() { //Método da página que, através da matrícula do aluno, pesquisa um usuário
		
	}
	
	@EscolaAdmin
	public Usuario findUsuario(String matricula) { //Página de visualização da senha do aluno
		Usuario usuario = usuarioDAO.find(matricula); //Pega o usuario no banco. Apesar de retornar o objeto inteiro, a única coisa que a página vai extrair é a senha para visualização.
		return usuario;
	}
	
}
